#include <stdio.h>

// 定义日志等级
#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO 1
#define LOG_LEVEL_WARN 2
#define LOG_LEVEL_ERROR 3

// 默认日志等级，比如设置为INFO，即只打印INFO、WARN和ERROR级别的日志
#define DEFAULT_LOG_LEVEL LOG_LEVEL_DEBUG

// ANSI 颜色代码
#define ANSI_COLOR_BLUE "\x1b[94m"
#define ANSI_COLOR_LIGHT_GREEN "\x1b[92;1m" // 浅绿色（亮）
#define ANSI_COLOR_BRIGHT_YELLOW "\x1b[93;1m" // 亮黄色
#define ANSI_COLOR_RED "\x1b[91m"
#define ANSI_COLOR_RESET "\x1b[0m"


// 判断当前是否应该打印日志的宏
#define SHOULD_LOG(level) ((level) >= DEFAULT_LOG_LEVEL)

// 封装printf的宏定义，用于打印日志
// with color
#define LOG_INTERNAL(level, color, format, ...) \
    do { \
        if (SHOULD_LOG(level)) { \
            printf("%s[%s] ", color, #level); \
            printf(format, ##__VA_ARGS__); \
            printf("%s\n", ANSI_COLOR_RESET); \
        } \
    } while (0)

// without color
//#define LOG_INTERNAL(level, color, format, ...) \
//    do { \
//        if (SHOULD_LOG(level)) { \
//            printf("[%s] ", #level); \
//            printf(format, ##__VA_ARGS__); \
//            printf("\n"); \
//        } \
//    } while (0)

// 为不同日志等级定义单独的宏，并为每个级别分配一个颜色
#define LOG_DEBUG(format, ...)   LOG_INTERNAL(LOG_LEVEL_DEBUG, ANSI_COLOR_BLUE, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...)    LOG_INTERNAL(LOG_LEVEL_INFO, ANSI_COLOR_LIGHT_GREEN, format, ##__VA_ARGS__)
#define LOG_WARN(format, ...)    LOG_INTERNAL(LOG_LEVEL_WARN, ANSI_COLOR_BRIGHT_YELLOW, format, ##__VA_ARGS__)
#define LOG_ERROR(format, ...)   LOG_INTERNAL(LOG_LEVEL_ERROR, ANSI_COLOR_RED, format, ##__VA_ARGS__)

// 使用示例
int main() {
    LOG_DEBUG("This is a debug message, %d", 1); // 不会打印，因为低于DEFAULT_LOG_LEVEL
    LOG_INFO("This is an info message, %d", 2); // 会打印，绿色
    LOG_WARN("This is a warning message, %d", 3); // 会打印，黄色
    LOG_ERROR("This is an error message, %d", 4); // 会打印，红色
    return 0;
}